module tb_UART2BRAM_TOP;
    reg clk_in, sin, read_ack;
    // reg rst_in,;
    // wire [7:0] sdata;
    
    wire [3:0]  bram_we;    // BRAM写使能
    wire [31:0] bram_addr;  // BRAM地址
    wire [31:0] bram_din;   // BRAM数据输入
    wire        bram_en;     // BRAM使能
    wire        bram_rst_n;
    // wire        bram_clk;
    wire        all_data_valid;    // 所有320字节数据接收完成

    wire [7:0]  sdata_debug;         // 接收数据调试输出
    wire        data_valid_debug;    // 数据有效调试输出
    wire        parity_valid_debug;  // 奇校验调试输出

    UART2BRAM_TOP uut (
        .clk_in(clk_in),
        // .rst_in(rst_in),
        .sin(sin),
        .read_ack(read_ack),
        .bram_we(bram_we),
        .bram_addr(bram_addr),
        .bram_din(bram_din),
        .bram_en(bram_en), 
        .bram_rst_n(bram_rst_n),
        // .bram_clk(bram_clk), 
        .all_data_valid(all_data_valid),
        .sdata_debug(sdata_debug),
        .data_valid_debug(data_valid_debug),
        .parity_valid_debug(parity_valid_debug)
    );


    // 50MHz时钟生成
    always #10 clk_in = ~clk_in;
    
    initial begin
        // 初始化
        clk_in = 0;
        // rst_in = 1;
        sin = 1;
        read_ack = 0;  
        #100 
        // rst_in = 0;
        // sin = 1;
        #900
        // 测试正常数据接收
        // $display("=== Testing normal data reception ===");
        send_byte(8'h55, 1'b1);  // 正确奇校验
        // #8000;
        send_byte(8'hA1, 1'b0);  // 正确奇校验
        #8000;

        read_ack = 1;
        #1000
        read_ack = 0;
        #1000
        
        // // 测试校验错误
        // $display("=== Testing parity error ===");
        send_byte(8'h55, 1'b1);  // 错误奇校验
        // #8000;

        send_byte(8'hf0, 1'b1);  // 错误奇校验
        #8000;

        read_ack = 1;
        #1000
        read_ack = 0;
        // #1000
        
        // $display("=== Test completed ===");
        // #1000 $finish;
    end
    
    task send_byte;
        input [7:0] data;
        input parity_bit;
        integer i;
        begin
            // 起始位
            sin = 0;
            #8680;
            
            // 数据位 (LSB first)
            for (i = 0; i < 8; i = i + 1) begin
                sin = data[i];
                #8680;
            end
            
            // 奇校验位
            sin = parity_bit;
            #8680;
            
            // 停止位
            sin = 1;
            #8680;
        end
    endtask
    
    // // 监控输出
    // always @(posedge clk_in) begin
    //     if (data_valid) begin
    //         $display("Time %0t: Data=0x%h, Parity_valid=%b", 
    //                  $time, sdata, parity_valid);
    //     end
    // end
    
endmodule
